import tkinter as tk
from tkinter import ttk

from utils.config_manager import NetworkConfigManager, PrintConfigManager
from views.printer.printer_view import PrinterView


class MainView:
    """主界面视图类 - 带右侧功能展示区"""

    def __init__(self, root, controller):
        self.root = root
        self.controller = controller
        self.config_manager = NetworkConfigManager()
        self.print_config_manager = PrintConfigManager()
        self.current_content = None  # 当前显示的内容框架
        self.network_icon = None
        self.main_paned = None
        self.nav_frame = None
        self.content_frame = None
        self.status_label = None
        self.adapter_status = None
        self.animation_active = False
        self.setup_ui()

    def setup_ui(self):
        """设置主界面GUI - 带右侧功能展示区"""
        # 设置主窗口大小
        self.root.geometry("1200x850")

        # 主框架 - 使用PanedWindow实现可调节大小的左右分割
        self.main_paned = tk.PanedWindow(
            self.root, orient=tk.HORIZONTAL, sashwidth=4, sashrelief=tk.RAISED
        )
        self.main_paned.pack(fill=tk.BOTH, expand=True)

        # 左侧导航栏框架
        self.nav_frame = ttk.LabelFrame(self.main_paned, text="功能导航", width=150)
        self.main_paned.add(self.nav_frame, stretch="never")

        # 右侧内容区域
        self.content_frame = ttk.Frame(self.main_paned)
        self.main_paned.add(self.content_frame, stretch="always")

        # 设置左侧导航栏的最小宽度
        self.nav_frame.grid_propagate(False)
        self.nav_frame.config(width=150)

        # 初始化导航栏
        self.setup_navigation()

        # 状态栏
        self.setup_status_bar()

        # 初始显示欢迎界面
        self.show_welcome_content()

    def setup_navigation(self):
        """设置左侧导航栏"""
        # 标题
        title_label = ttk.Label(
            self.nav_frame,
            text="功能导航",
            font=("Arial", 12, "bold"),
            padding=(10, 15, 10, 15),
        )
        title_label.pack(fill=tk.X)

        # 分隔线
        ttk.Separator(self.nav_frame, orient=tk.HORIZONTAL).pack(fill=tk.X, pady=5)

        # 功能按钮 - 使用更清晰的图标和布局
        nav_buttons = [
            {"text": "网络切换", "command": self.show_ip_content, "icon": "🌐"},
            {"text": "台账收集", "command": self.show_collect_picture_content, "icon": "🔍"},
            {"text": "打印控件", "command": self.show_printer_content, "icon": "🖨"},
            {"text": "提醒任务", "command": self.show_reminder_content, "icon": "⏰"},
            {"text": "任务报表", "command": self.show_report_content, "icon": "📊"},
            {"text": "使用帮助", "command": self.show_help_content, "icon": "❓"},
        ]

        # 创建导航按钮
        for btn_info in nav_buttons:
            btn = ttk.Button(
                self.nav_frame,
                text=f"{btn_info['icon']} {btn_info['text']}",
                command=btn_info["command"],
                padding=5,
                width=15,
            )
            btn.pack(fill=tk.X, padx=10, pady=5)

        # 添加一个空白区域使按钮居中
        ttk.Frame(self.nav_frame, height=20).pack(side=tk.BOTTOM, fill=tk.X)

    def setup_status_bar(self):
        """设置底部状态栏"""
        status_frame = ttk.Frame(self.root)
        status_frame.pack(fill=tk.X, side=tk.BOTTOM)

        self.status_label = ttk.Label(
            status_frame,
            text="就绪",
            foreground="gray",
            anchor=tk.W,
            padding=(5, 2, 5, 2),
        )
        self.status_label.pack(side=tk.LEFT, fill=tk.X, expand=True)

        # 网络状态指示器
        network_frame = ttk.Frame(status_frame)
        network_frame.pack(side=tk.RIGHT, padx=5)

        self.network_icon = ttk.Label(
            network_frame, text="📡", font=("Arial", 10), padding=(0, 0, 5, 0)
        )
        self.network_icon.pack(side=tk.LEFT)

        self.adapter_status = ttk.Label(
            network_frame, text="●", foreground="green", font=("Arial", 12, "bold")
        )
        self.adapter_status.pack(side=tk.LEFT)

    def clear_content(self):
        """清除右侧内容区域"""
        if self.current_content:
            self.animation_active = False
            self.current_content.destroy()
            self.current_content = None

    def show_welcome_content(self):
        """显示生动有趣的欢迎内容"""
        self.clear_content()

        welcome_frame = ttk.Frame(self.content_frame)
        welcome_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        self.current_content = welcome_frame

        # 使用Canvas创建更有趣的背景
        canvas = tk.Canvas(welcome_frame, bg="#f0f8ff", highlightthickness=0)
        canvas.pack(fill=tk.BOTH, expand=True)

        # 绘制装饰性背景元素
        canvas.create_oval(50, 30, 250, 230, fill="#e6f7ff", outline="")
        canvas.create_rectangle(800, 50, 1000, 150, fill="#fff2e6", outline="")

        # 动态元素 - 云朵
        self.cloud1 = canvas.create_oval(700, 80, 800, 100, fill="white", outline="")
        self.cloud2 = canvas.create_oval(750, 70, 850, 90, fill="white", outline="")
        self.cloud3 = canvas.create_oval(780, 85, 880, 105, fill="white", outline="")

        # 标题区域
        title_frame = ttk.Frame(canvas)
        canvas.create_window(600, 100, window=title_frame, anchor=tk.CENTER)

        # 欢迎标题 - 使用不同颜色和字体增加趣味性
        title = ttk.Label(
            title_frame,
            text="🌟 OT-SLAYER 🌟",
            font=("微软雅黑", 24, "bold"),
            foreground="#2c3e50",
            background="#f0f8ff",
        )
        title.pack(pady=10)

        # 副标题 - 增加动画感
        subtitle_text = "让工作变得简单又高效！"
        subtitle = ttk.Label(
            title_frame,
            text=subtitle_text,
            font=("楷体", 14),
            foreground="#3498db",
            background="#f0f8ff",
        )
        subtitle.pack(pady=(0, 20))

        # 装饰性分隔线 - 使用波浪线增加趣味
        wave_canvas = tk.Canvas(
            title_frame, height=20, bg="#f0f8ff", highlightthickness=0
        )
        wave_canvas.pack(fill=tk.X, pady=10)
        for i in range(0, 600, 30):
            wave_canvas.create_arc(
                i, 0, i + 30, 20, start=0, extent=180, outline="#3498db", width=2
            )

        # 欢迎信息卡片
        info_card = ttk.Frame(canvas, style="Card.TFrame")
        canvas.create_window(600, 250, window=info_card, anchor=tk.CENTER)

        # 添加卡片样式
        style = ttk.Style()
        style.configure(
            "Card.TFrame", background="white", borderwidth=2, relief="ridge", padding=20
        )

        # 随机欢迎语 - 每次打开显示不同的问候
        greetings = [
            "🎉 欢迎使用政务效率工具！助您高效完成日常工作",
            "🚀 一键切换内外网，安全便捷提升工作效率",
            "📊 任务报表已就绪，工作成果一目了然",
            "📑 智能台账管理，让数据整理轻松高效",
            "⏰ 重要事项提醒功能，不再错过任何截止日期",
            "🔒 安全稳定的内外网切换，保障工作数据安全",
            "👨‍💼 专业政务工具，为您的工作提质增效",
        ]

        import random

        greeting = random.choice(greetings)

        greeting_label = ttk.Label(
            info_card,
            text=greeting,
            font=("微软雅黑", 12),
            foreground="#2c3e50",
            background="white",
            wraplength=500,
            justify=tk.CENTER,
        )
        greeting_label.pack(pady=10)

        # 功能提示
        tips = [
            "💡 提示：使用'任务报表'功能可生成月度工作总结",
            "⏱️ 提示：设置定期提醒，避免错过重要会议和报送节点",
            "📌 提示：'台账收集'功能可方便收集台账数据到word文档",
            "🔐 提示：切换网络前请保存文档，确保工作数据安全",
        ]

        tip_label = ttk.Label(
            info_card,
            text=random.choice(tips),
            font=("楷体", 10),
            foreground="#7f8c8d",
            background="white",
            wraplength=450,
        )
        tip_label.pack(pady=5)

        # 装饰性图标区域
        icons_frame = ttk.Frame(canvas, style="Card.TFrame")
        canvas.create_window(600, 400, window=icons_frame, anchor=tk.CENTER)

        # 功能图标展示
        # 功能图标和对应命令的映射
        icon_commands = [
            ("🌐", "网络切换", self.show_ip_content),
            ("⏰", "提醒任务", self.show_reminder_content),
            ("📊", "任务报表", self.show_report_content),
            ("🔍", "台账收集", self.show_collect_picture_content),
            ("❓", "使用帮助", self.show_help_content),
        ]

        # 为图标框创建单独的样式
        style = ttk.Style()
        style.configure("IconFrame.TFrame", background="white")
        style.map("IconFrame.TFrame", background=[("active", "#f0f0f0")])

        for i, (icon, label, command) in enumerate(icon_commands):
            # 使用 tk.Frame 而不是 ttk.Frame
            icon_frame = tk.Frame(icons_frame, bg="white", bd=0, highlightthickness=0)
            icon_frame.grid(row=0, column=i, padx=15, pady=10)

            # 添加图标标签并绑定点击事件
            icon_label = tk.Label(
                icon_frame,
                text=icon,
                font=("Arial", 24),
                bg="white",  # 设置背景色
                fg="black",  # 设置文字颜色
            )
            icon_label.pack()
            icon_label.bind("<Button-1>", lambda e, cmd=command: cmd())

            # 添加文字标签并绑定点击事件
            text_label = tk.Label(
                icon_frame,
                text=label,
                font=("微软雅黑", 9),
                bg="white",  # 设置背景色
                fg="black",  # 设置文字颜色
            )
            text_label.pack()
            text_label.bind("<Button-1>", lambda e, cmd=command: cmd())

            # 添加悬停效果 - 使用 tk.Frame 支持的背景色设置
            icon_frame.bind(
                "<Enter>", lambda e, frame=icon_frame: frame.configure(bg="#f0f0f0")
            )
            icon_frame.bind(
                "<Leave>", lambda e, frame=icon_frame: frame.configure(bg="white")
            )

            # 同时更新子组件的背景色
            icon_frame.bind(
                "<Enter>",
                lambda e, label1=icon_label, label2=text_label: (
                    label1.configure(bg="#f0f0f0"),
                    label2.configure(bg="#f0f0f0"),
                ),
            )
            icon_frame.bind(
                "<Leave>",
                lambda e, label1=icon_label, label2=text_label: (
                    label1.configure(bg="white"),
                    label2.configure(bg="white"),
                ),
            )

        # 添加装饰性元素动画
        self.animation_active = True
        self.animate_clouds(canvas)

    def animate_clouds(self, canvas):
        """云朵动画效果"""
        if not self.animation_active:
            return

        # 检查画布是否仍然存在
        try:
            # 检查画布是否存在
            if not canvas.winfo_exists():
                self.animation_active = False
                return
        except tk.TclError:
            self.animation_active = False
            return

        # 移动云朵
        canvas.move(self.cloud1, 1, 0)
        canvas.move(self.cloud2, 1, 0)
        canvas.move(self.cloud3, 1, 0)

        # 检查边界并重置位置
        cloud1_pos = canvas.coords(self.cloud1)
        if cloud1_pos[2] > 1200:
            canvas.coords(self.cloud1, -100, cloud1_pos[1], 0, cloud1_pos[3])

        # 100毫秒后再次调用动画
        if self.animation_active:
            self.root.after(100, lambda: self.animate_clouds(canvas))

    def show_ip_content(self):
        """显示IP切换内容"""
        self.clear_content()

        ip_frame = ttk.Frame(self.content_frame)
        ip_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        self.current_content = ip_frame

        # 标题
        title = ttk.Label(ip_frame, text="网络配置切换", font=("Arial", 16, "bold"))
        title.pack(pady=(0, 20))

        # 按钮框架
        btn_frame = ttk.Frame(ip_frame)
        btn_frame.pack(pady=10)

        # 内网切换按钮
        ttk.Button(
            btn_frame,
            text="🌐 切换到内网",
            command=lambda: self.controller.switch_network("internal"),
            width=15,
            padding=8,
        ).pack(side=tk.LEFT, padx=10, pady=5)

        # 外网切换按钮
        ttk.Button(
            btn_frame,
            text="🌐 切换到外网",
            command=lambda: self.controller.switch_network("external"),
            width=15,
            padding=8,
        ).pack(side=tk.LEFT, padx=10, pady=5)

        # 当前配置查看按钮
        ttk.Button(
            btn_frame,
            text="🔍 查看当前配置",
            command=self.show_current_config_content,
            width=15,
            padding=8,
        ).pack(side=tk.LEFT, padx=10, pady=5)

        # 添加分隔线
        ttk.Separator(ip_frame, orient=tk.HORIZONTAL).pack(fill=tk.X, pady=20)

        # 网络设置按钮
        config_btn = ttk.Button(
            ip_frame,
            text="⚙️ 网络设置",
            command=self.open_unified_config,
            width=15,
            padding=8,
        )
        config_btn.pack(pady=10)

        # 状态提示
        self.status_label.config(text="请选择网络配置操作", foreground="gray")

    def show_current_config_content(self):
        """显示当前配置内容"""
        config = self.controller.ip_switcher.get_current_config()

        self.clear_content()

        config_frame = ttk.Frame(self.content_frame)
        config_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        self.current_content = config_frame

        # 标题
        title = ttk.Label(config_frame, text="当前网络配置", font=("Arial", 16, "bold"))
        title.pack(pady=(0, 20))

        # 配置信息显示区域
        info_frame = ttk.LabelFrame(config_frame, text="配置详情")
        info_frame.pack(fill=tk.BOTH, padx=20, pady=10, expand=True)

        # 创建文本区域显示配置信息
        text = tk.Text(
            info_frame, wrap=tk.WORD, font=("Consolas", 10), padx=10, pady=10, height=15
        )
        text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        # 插入配置信息
        text.insert(tk.END, config)
        text.config(state=tk.DISABLED)  # 设置为只读

        # 添加滚动条
        scrollbar = ttk.Scrollbar(info_frame, command=text.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        text.config(yscrollcommand=scrollbar.set)

        # 关闭按钮
        close_btn = ttk.Button(
            config_frame, text="关闭", command=self.show_ip_content, width=15
        )
        close_btn.pack(pady=10)

    def show_reminder_content(self):
        """显示提醒任务内容 - 内嵌版"""
        self.clear_content()

        # 创建提醒任务框架
        self.current_content = ttk.Frame(self.content_frame)
        self.current_content.pack(fill=tk.BOTH, expand=True)

        # 标题
        ttk.Label(
            self.current_content, text="任务管理系统", font=("Arial", 16, "bold")
        ).pack(pady=(20, 10))

        # 调用任务管理视图的内嵌版本
        self.controller.show_reminder_dialog(container=self.current_content)

    def show_report_content(self):
        """显示任务报表内容 - 内嵌版"""
        self.clear_content()

        # 创建报表框架
        self.current_content = ttk.Frame(self.content_frame)
        self.current_content.pack(fill=tk.BOTH, expand=True)

        # 标题
        ttk.Label(
            self.current_content, text="任务报表分析", font=("Arial", 16, "bold")
        ).pack(pady=(20, 10))

        # 调用报表视图的内嵌版本
        self.controller.show_report_view(container=self.current_content)

    def show_network_config_content(self):
        """显示网络设置内容 - 内嵌版"""
        self.clear_content()

        # 创建网络设置框架
        self.current_content = ttk.Frame(self.content_frame)
        self.current_content.pack(fill=tk.BOTH, expand=True)

        # 调用网络设置视图的内嵌版本
        self.controller.show_network_config(
            config_manager=self.config_manager, container=self.current_content
        )

    def show_printer_content(self):
        """显示打印机管理内容"""
        self.clear_content()

        # 创建打印机视图框架，并传递所需的控制器和配置管理器
        self.current_content = PrinterView(
            self.content_frame, self.controller, self.print_config_manager
        )
        self.current_content.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        self.status_label.config(text="打印机管理", foreground="gray")

    def show_collect_picture_content(self):
        """显示网络诊断内容"""
        self.clear_content()

        diag_frame = ttk.Frame(self.content_frame)
        diag_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        self.current_content = diag_frame

        # 标题
        ttk.Label(diag_frame, text="台账收集", font=("Arial", 16, "bold")).pack(
            pady=(0, 20)
        )

        # 调用台账收集视图的内嵌版本
        self.controller.show_collect_picture(
            container=self.current_content, config_manager=self.config_manager
        )

    def show_help_content(self):
        """显示使用帮助内容"""
        self.clear_content()

        help_frame = ttk.Frame(self.content_frame)
        help_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        self.current_content = help_frame

        # 标题
        ttk.Label(help_frame, text="使用帮助", font=("Arial", 16, "bold")).pack(
            pady=(0, 20)
        )

        # 帮助文本
        help_text = """
        OT-SLAYER使用指南

        1. 网络切换：需要先配置内网和外网的切换方式，然后快速切换内网和外网配置
        2. 提醒任务：创建和管理系统提醒任务
        3. 任务报表：查看任务完成情况的统计报表
        4. 台账收集：收集照片到word文档里面

        """

        # 创建文本区域
        text = tk.Text(
            help_frame, wrap=tk.WORD, font=("Arial", 11), padx=15, pady=15, height=15
        )
        text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        text.insert(tk.END, help_text)
        text.config(state=tk.DISABLED)  # 设置为只读

    def open_unified_config(self):
        """显示提醒任务内容 - 内嵌版"""
        self.clear_content()

        # 创建提醒任务框架
        self.current_content = ttk.Frame(self.content_frame)
        self.current_content.pack(fill=tk.BOTH, expand=True)

        # 标题
        ttk.Label(
            self.current_content, text="网络配置", font=("Arial", 16, "bold")
        ).pack(pady=(20, 10))
        self.controller.show_network_config(
            config_manager=self.config_manager, container=self.current_content
        )

    def update_status(self, message, success):
        """更新状态标签"""
        self.status_label.config(text=message, foreground="green" if success else "red")

        # 更新网络状态指示器
        self.adapter_status.config(foreground="green" if success else "red")
